Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

305
Vistas
¿Por qué no es un error incrementar la matriz "a" en la siguiente función?
#include<stdio.h> void printd(char []); int main(void){ char a[100]; a[0]='a';a[1]='b';a[2]='c';a[4]='d'; printd(a); return 0; } void printd(char a[]){ a++; printf("%c",*a); a++; printf("%c",*a); }

Explicación: Esperaba que resultara en un error de lvalue. Pero está funcionando sin ningún error y dando bc como salida. ¿Por qué esta matriz incremental "a" no es un error?

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Si una matriz se pasa a una función, decae en un puntero al primer elemento de la matriz.

Debido a esto dentro de printd() el puntero a puede incrementarse y disminuirse, para apuntar a diferentes elementos de la matriz a como se define en main() .

Tenga en cuenta que al declarar/definir la lista de parámetros de una función para cualquier tipo T , la expresión T[] es equivalente a T* .

En el caso específico de la pregunta

 void printd(char a[]);

es lo mismo que

 void printd(char * a);

El siguiente código muestra un comportamiento equivalente al código del OP, con pa comportándose como a lado printd() :

 #include <stdio.h> int main(void) { char a[100]; a[0]='a';a[1]='b';a[2]='c';a[4]='d'; { char * pa = a; pa++; printf("%c", *pa); pa++; printf("%c", *pa); } return 0; `}
over 4 years ago · Santiago Trujillo Denunciar

0

En lenguaje C, la declaración de matriz en la lista de parámetros de función y la declaración de matriz fuera de la lista de parámetros de función significan cosas completamente diferentes, aunque parezcan similares (o iguales) en la superficie.

Cuando usa la declaración de matriz en la lista de parámetros de funciones (como es el caso con void printd(char a[]) en su código), no está declarando una matriz. La sintaxis de nivel superior [] en la lista de parámetros de función es solo una forma alternativa de declaración de puntero . Esto significa que su parámetro a se declara realmente como char *a . No es una matriz en absoluto, es un puntero ordinario. No hay nada inusual en poder incrementar a , y es por eso que no obtiene ningún "error de valor l".

Mientras tanto, su a en main es una verdadera matriz.

over 4 years ago · Santiago Trujillo Denunciar

0

¿Por qué esta matriz incremental "a" no es un error?

En C, las matrices se pasan como un puntero a cualquier función. Por eso no te da error.

Las llamadas de función en main() pasan el nombre de la matriz, a , como argumento porque el nombre de una matriz en una expresión se evalúa como un puntero a la matriz . En otras palabras, la expresión, a , es un puntero a (el primer elemento de) la matriz, a[] . Su tipo es, por lo tanto, char * , y una función llamada usa este puntero (pasado como argumento) para acceder indirectamente a los elementos de la matriz.

Ahora, al recibir la dirección del primer elemento de a , a++ significa adelantar la dirección inicial de la matriz en 1 . Es por eso que el primer printf imprime b , el segundo elemento de la matriz a .

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda